package modelo.obstaculos;

import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;

import modelo.interfaces.Manejador;
import modelo.interfaces.Posicionable;
import modelo.juego.Jugador;
import modelo.mapa.Casillero;
import modelo.mapa.Mapa;
import modelo.obstaculos.NoAlcanzaElDineroException;


public class ManejadorObstaculos implements Manejador, Serializable{

	private static final long serialVersionUID = 8132939492890168695L;
	private Manejador manejadorEnemigos;
	private Mapa mapa;
	private Collection<Obstaculo> obstaculos;
	private Jugador jugador;

	public ManejadorObstaculos(Mapa mapa, Manejador manejadorEnemigos, Jugador jugador) {
		this.manejadorEnemigos = manejadorEnemigos;
		this.mapa = mapa;
		this.jugador = jugador;
		this.obstaculos = new LinkedList<Obstaculo>();
	}

	public void latir() {

		Iterator<Obstaculo> itObstaculos = this.obstaculos.iterator();

		while (itObstaculos.hasNext()) {
			Obstaculo obstaculo = (Obstaculo) itObstaculos.next();
			obstaculo.Actuar();
		}

	}
	public void redibujarComponentes(){
		Iterator<Obstaculo> itObstaculos = this.obstaculos.iterator();

		while (itObstaculos.hasNext()) {
			Obstaculo obstaculo = (Obstaculo) itObstaculos.next();
			obstaculo.RecrearVista();
		}
		
	}
	
	public void crearObstaculo(Casillero casillero, CreadorObstaculo tipo) {

		if (this.mapa.esCamino(casillero, 0)) {
			Collection<Posicionable> elementos = mapa.elementosEnRango(casillero, 0);
			Iterator iteradorElementos = elementos.iterator();
			Object objeto;
			Boolean valido = true;
			
			while ((iteradorElementos.hasNext()) && (valido)) {
				objeto = iteradorElementos.next();
					if (objeto instanceof Obstaculo) 
						valido = false;
				}
				
			if (valido) {
				try {
					Obstaculo unObstaculo = tipo.CrearObstaculo(this);
					this.mapa.posicionarPosicionable(casillero, unObstaculo);
					this.obstaculos.add(unObstaculo);
				} catch (NoAlcanzaElDineroException e) {
					
				}
			}
		}
	}


	public void destruirObstaculo(Obstaculo obstaculo) {
		obstaculo.getEfectos().clear();
		this.obstaculos.remove(obstaculo);
		this.mapa.removerPosicionable(obstaculo);

	}

	public Manejador getManejadorEnemigos() {
		return this.manejadorEnemigos;
	}

	public Mapa getMapa() {
		return this.mapa;
	}

	public Jugador getJugador() {
		return this.jugador;
	}

	public Collection<Obstaculo> getObstaculos() {
		return this.obstaculos;
	}

}
